#include <iostream>
#include <pthread.h>
#include <thread>
#include <string>
#include <cstring>
#include <unistd.h>
#include <cstdio>

// 全局变量线程内是共享的 和static 一样在栈区
int argv = 100;

std::string toHex(pthread_t tid)
{
    // 进程内的函数在栈上，线程共享
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "0x%lx", tid);
    return buffer;
}

void *rountine1(void *args) // 不可重入函数    可能会错乱
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        // 不加保护的情况下，显示器文件就是共享资源(都可以调用toHex函数)
        std::cout << "我是新线程，我的名字是: " << name << ", my tid is: " << toHex(pthread_self()) << ",全局变量(修改): " << argv << std::endl;
        argv++;
        sleep(1);

        // int *p = nullptr; //一个线程异常 其他线程和 对应的进程都会一起崩掉
        // *p = 100;
    }

    return 0;
}

void *rountine2(void *args) // 不可重入函数    可能会错乱
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        // 不加保护的情况下，显示器文件就是共享资源(都可以调用toHex函数)
        std::cout << "我是新线程，我的名字是: " << name << ", my tid is: " << toHex(pthread_self()) << ",全局变量(只是检测)： " << argv << std::endl;
        sleep(1);
    }
    return 0;
}

int main()
{
    // 新线程和main线程谁先运行不确定
    // 线程创建出来要对进程的时间片进行瓜分
    pthread_t tid1;
    pthread_create(&tid1, nullptr, rountine1, (void *)"thread-1"); // rountine变一下 就可以不同线程执行不同函数
    pthread_t tid2;
    pthread_create(&tid2, nullptr, rountine2, (void *)"thread-2");
    // pthread_t tid3;
    // pthread_create(&tid3, nullptr, rountine, (void *)"thread-3");
    // pthread_t tid4;
    // pthread_create(&tid4, nullptr, rountine, (void *)"thread-4");

    // std::cout << "new thread id: " << tid << std::endl; //用C++打印这里不建议
    printf("new thread id: 0x%lx\n", tid1); // 打印创建的新线程的id 且是十六进制
    printf("new thread id: 0x%lx\n", tid2);
    // printf("new thread id: 0x%lx\n", tid3);
    // printf("new thread id: 0x%lx\n", tid4);

    while (true)
    {
        std::cout << "我是main线程..." << std::endl;
        sleep(1);
    }

    return 0;
}

// 测试创建线程成功
//  void *routine(void *args)
//  {
//      std::string name = static_cast<const char *>(args);
//      while (true)
//      {
//          std::cout << "我是新线程，我的名字是: " << name << std::endl;
//          sleep(1);
//      }
//      return 0;
//  }
//  int main()
//  {
//      pthread_t tid;
//      int n = pthread_create(&tid, nullptr, routine, (void *)"thread-1");
//      if (n != 0)  //返回值部位0说明创建线程失败
//      {
//          std::cout << "create thread error: " << strerror(n) << std::endl;
//          return 1;
//      }
//      while (true)
//      {
//          std::cout << "我是main线程..." << std::endl;
//          sleep(1);
//      }
//      return 0;
//  }